package com.zp.self.module.level_4_算法练习.算法.双指针.左右指针;

import java.util.Arrays;

/**
 * @author By ZengPeng
 */
public class 力扣_977_有序数组的平方 {
    //测试
    public static void main(String[] args) {

        System.out.println(Arrays.toString(new 力扣_977_有序数组的平方().sortedSquares(new int[]{-4,-1,0,3,10})));
        System.out.println(Arrays.toString(new 力扣_977_有序数组的平方().sortedSquares(new int[]{-7, -3, 2, 3, 11})));
        System.out.println(Arrays.toString(new 力扣_977_有序数组的平方().sortedSquares(new int[]{-7})));
        System.out.println(Arrays.toString(new 力扣_977_有序数组的平方().sortedSquares(new int[]{-7,-7})));
    }

    /**
    题目：给你一个按 非递减顺序 排序的整数数组 nums，
     返回 每个数字的平方 组成的新数组，要求也按 非递减顺序 排序。

     示例 1：
     输入：nums = [-4,-1,0,3,10]
     输出：[0,1,9,16,100]
     解释：平方后，数组变为 [16,1,0,9,100]
     排序后，数组变为 [0,1,9,16,100]

     示例 2：
     输入：nums = [-7,-3,2,3,11]
     输出：[4,9,9,49,121]

    分析：【P ♥♥】
       1.简单方法：计算后排序  --时间复杂度 O(n * log n)
       2.双指针：比较两端绝对值的大小，进行平方记录结果。将结果插入返回数组最后面  --时间复杂度 O(n * log n)
                --执行用时：1 ms, 在所有 Java 提交中击败了100.00%的用户
    边界值 & 注意点：
       1.
     **/
    public int[] sortedSquares(int[] nums) {
        int left=0,right=nums.length-1,index =right;
        int[] res =new int[nums.length];
        while (left<=right){
            if(Math.abs(nums[left])>Math.abs(nums[right]))
                res[index--] =nums[left]*nums[left++];
           else
                res[index--] =nums[right]*nums[right--];
        }
        return  res;
    }
}
